#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int g_val_1;
int g_val_2 = 100;

int main(int argc, char* argv[], char* env[])
{
//    printf("我是一个进程, pid : %d, ppid : %d, g_val_1 : %d, "
//            "&g_val_2 : %p\n", getpid(), getppid(), g_val_2, &g_val_2);
//    pid_t id = fork();
//    if (id == 0)
//    {
//        int cnt = 5;
//        while (cnt--)
//        {
//            if (cnt == 0)
//            {
//                g_val_2 = 200;
//                --cnt;
//            }
//            printf("我是一个子进程, pid : %d, ppid : %d, g_val_2 : %d, "
//                    "&g_val_2 : %p\n", getpid(), getppid(), g_val_2, &g_val_2);
//            sleep(2);
//        }
//    }
//    else
//    {
//        while (1)
//        {
//            printf("我是一个父进程, pid : %d, ppid : %d, g_val_2 : %d, "
//                    "&g_val_2 : %p\n", getpid(), getppid(), g_val_2, &g_val_2);
//            sleep(2);
//        }
//    }

    // 地址分布依托系统
    printf("code addr : %p\n", main);
    char* str = "hello world";
    printf("read only addr : %p\n", str);
    printf("global addr1 : %p\n", &g_val_2);
    printf("global addr2 : %p\n", &g_val_1);
    char* mem1 = (char*)malloc(100);
    char* mem2 = (char*)malloc(100);
    char* mem3 = (char*)malloc(100);
    printf("heap addr : %p\n", mem1);
    printf("heap addr : %p\n", mem2);
    printf("heap addr : %p\n", mem3);
    static int a = 0;
    int b = 0;
    int c = 0;
    printf("stack addr : %p\n", &mem1);
    printf("stack addr : %p\n", &a);
    printf("stack addr : %p\n", &b);
    printf("stack addr : %p\n", &c);
    printf("环境变量表地址: %p\n", &env);
    printf("命令行参数表地址：%p\n", &argv);
    printf("增加一个环境变量\n");
    for (int i = 0; argv[i]; i++)
        printf("argv[%d] : %p\n", i, argv[i]);
    for (int i = 0; env[i]; i++)
        printf("env[%d] : %p\n", i, env[i]);
    
    return 0;
}
